﻿using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;

namespace MDAControlsFramework.Helpers {
	partial class Parser {
		private static Dictionary<string, Color> _colors = null;

		public static void fillColors() {
			if (_colors != null)
				return;

			_colors = new Dictionary<string, Color>(150);
			_colors.Add("antiquewhite", Color.AntiqueWhite);
			_colors.Add("aqua", Color.Aqua);
			_colors.Add("aquamarine", Color.Aquamarine);
			_colors.Add("azure", Color.Azure);
			_colors.Add("beige", Color.Beige);
			_colors.Add("bisque", Color.Bisque);
			_colors.Add("black", Color.Black);
			_colors.Add("blanchedalmond", Color.BlanchedAlmond);
			_colors.Add("blue", Color.Blue);
			_colors.Add("blueviolet", Color.BlueViolet);
			_colors.Add("brown", Color.Brown);
			_colors.Add("burlywood", Color.BurlyWood);
			_colors.Add("cadetblue", Color.CadetBlue);
			_colors.Add("chartreuse", Color.Chartreuse);
			_colors.Add("chocolate", Color.Chocolate);
			_colors.Add("coral", Color.Coral);
			_colors.Add("cornflowerblue", Color.CornflowerBlue);
			_colors.Add("cornsilk", Color.Cornsilk);
			_colors.Add("crimson", Color.Crimson);
			_colors.Add("cyan", Color.Cyan);
			_colors.Add("darkblue", Color.DarkBlue);
			_colors.Add("darkcyan", Color.DarkCyan);
			_colors.Add("darkgoldenrod", Color.DarkGoldenrod);
			_colors.Add("darkgray", Color.DarkGray);
			_colors.Add("darkgreen", Color.DarkGreen);
			_colors.Add("darkgrey", Color.DarkGray);
			_colors.Add("darkkhaki", Color.DarkKhaki);
			_colors.Add("darkmagenta", Color.DarkMagenta);
			_colors.Add("darkolivegreen", Color.DarkOliveGreen);
			_colors.Add("darkorange", Color.DarkOrange);
			_colors.Add("darkorchid", Color.DarkOrchid);
			_colors.Add("darkred", Color.DarkRed);
			_colors.Add("darksalmon", Color.DarkSalmon);
			_colors.Add("darkseagreen", Color.DarkSeaGreen);
			_colors.Add("darkslateblue", Color.DarkSlateBlue);
			_colors.Add("darkslategray", Color.DarkSlateGray);
			_colors.Add("darkslategrey", Color.DarkSlateGray);
			_colors.Add("darkturquoise", Color.DarkTurquoise);
			_colors.Add("darkviolet", Color.DarkViolet);
			_colors.Add("deeppink", Color.DeepPink);
			_colors.Add("deepskyblue", Color.DeepSkyBlue);
			_colors.Add("dimgray", Color.DimGray);
			_colors.Add("dimgrey", Color.DimGray);
			_colors.Add("dodgerblue", Color.DodgerBlue);
			_colors.Add("firebrick", Color.Firebrick);
			_colors.Add("floralwhite", Color.FloralWhite);
			_colors.Add("forestgreen", Color.ForestGreen);
			_colors.Add("fuchsia", Color.Fuchsia);
			_colors.Add("gainsboro", Color.Gainsboro);
			_colors.Add("ghostwhite", Color.GhostWhite);
			_colors.Add("gold", Color.Gold);
			_colors.Add("goldenrod", Color.Goldenrod);
			_colors.Add("gray", Color.Gray);
			_colors.Add("green", Color.Green);
			_colors.Add("greenyellow", Color.GreenYellow);
			_colors.Add("grey", Color.Gray);
			_colors.Add("honeydew", Color.Honeydew);
			_colors.Add("hotpink", Color.HotPink);
			_colors.Add("indianred", Color.IndianRed);
			_colors.Add("indigo", Color.Indigo);
			_colors.Add("ivory", Color.Ivory);
			_colors.Add("khaki", Color.Khaki);
			_colors.Add("lavender", Color.Lavender);
			_colors.Add("lavenderblush", Color.LavenderBlush);
			_colors.Add("lawngreen", Color.LawnGreen);
			_colors.Add("lemonchiffon", Color.LemonChiffon);
			_colors.Add("lightblue", Color.LightBlue);
			_colors.Add("lightcoral", Color.LightCoral);
			_colors.Add("lightcyan", Color.LightCyan);
			_colors.Add("lightgoldenrodyellow", Color.LightGoldenrodYellow);
			_colors.Add("lightgray", Color.LightGray);
			_colors.Add("lightgreen", Color.LightGreen);
			_colors.Add("lightgrey", Color.LightGray);
			_colors.Add("lightpink", Color.LightPink);
			_colors.Add("lightsalmon", Color.LightSalmon);
			_colors.Add("lightseagreen", Color.LightSeaGreen);
			_colors.Add("lightskyblue", Color.LightSkyBlue);
			_colors.Add("lightslategray", Color.LightSlateGray);
			_colors.Add("lightslategrey", Color.LightSlateGray);
			_colors.Add("lightsteelblue", Color.LightSteelBlue);
			_colors.Add("lightyellow", Color.LightYellow);
			_colors.Add("lime", Color.Lime);
			_colors.Add("limegreen", Color.LimeGreen);
			_colors.Add("linen", Color.Linen);
			_colors.Add("magenta", Color.Magenta);
			_colors.Add("maroon", Color.Maroon);
			_colors.Add("mediumaquamarine", Color.MediumAquamarine);
			_colors.Add("mediumblue", Color.MediumBlue);
			_colors.Add("mediumorchid", Color.MediumOrchid);
			_colors.Add("mediumpurple", Color.MediumPurple);
			_colors.Add("mediumseagreen", Color.MediumSeaGreen);
			_colors.Add("mediumslateblue", Color.MediumSlateBlue);
			_colors.Add("mediumspringgreen", Color.MediumSpringGreen);
			_colors.Add("mediumturquoise", Color.MediumTurquoise);
			_colors.Add("mediumvioletred", Color.MediumVioletRed);
			_colors.Add("midnightblue", Color.MidnightBlue);
			_colors.Add("mintcream", Color.MintCream);
			_colors.Add("mistyrose", Color.MistyRose);
			_colors.Add("moccasin", Color.Moccasin);
			_colors.Add("navajowhite", Color.NavajoWhite);
			_colors.Add("navy", Color.Navy);
			_colors.Add("oldlace", Color.OldLace);
			_colors.Add("olive", Color.Olive);
			_colors.Add("olivedrab", Color.OliveDrab);
			_colors.Add("orange", Color.Orange);
			_colors.Add("orangered", Color.OrangeRed);
			_colors.Add("orchid", Color.Orchid);
			_colors.Add("palegoldenrod", Color.PaleGoldenrod);
			_colors.Add("palegreen", Color.PaleGreen);
			_colors.Add("paleturquoise", Color.PaleTurquoise);
			_colors.Add("palevioletred", Color.PaleVioletRed);
			_colors.Add("papayawhip", Color.PapayaWhip);
			_colors.Add("peachpuff", Color.PeachPuff);
			_colors.Add("peru", Color.Peru);
			_colors.Add("pink", Color.Pink);
			_colors.Add("plum", Color.Plum);
			_colors.Add("powderblue", Color.PowderBlue);
			_colors.Add("purple", Color.Purple);
			_colors.Add("red", Color.Red);
			_colors.Add("rosybrown", Color.RosyBrown);
			_colors.Add("royalblue", Color.RoyalBlue);
			_colors.Add("saddlebrown", Color.SaddleBrown);
			_colors.Add("salmon", Color.Salmon);
			_colors.Add("sandybrown", Color.SandyBrown);
			_colors.Add("seagreen", Color.SeaGreen);
			_colors.Add("seashell", Color.SeaShell);
			_colors.Add("sienna", Color.Sienna);
			_colors.Add("silver", Color.Silver);
			_colors.Add("skyblue", Color.SkyBlue);
			_colors.Add("slateblue", Color.SlateBlue);
			_colors.Add("slategray", Color.SlateGray);
			_colors.Add("slategrey", Color.SlateGray);
			_colors.Add("snow", Color.Snow);
			_colors.Add("springgreen", Color.SpringGreen);
			_colors.Add("steelblue", Color.SteelBlue);
			_colors.Add("tan", Color.Tan);
			_colors.Add("teal", Color.Teal);
			_colors.Add("thistle", Color.Thistle);
			_colors.Add("tomato", Color.Tomato);
			_colors.Add("turquoise", Color.Turquoise);
			_colors.Add("violet", Color.Violet);
			_colors.Add("wheat", Color.Wheat);
			_colors.Add("white", Color.White);
			_colors.Add("whitesmoke", Color.WhiteSmoke);
			_colors.Add("yellow", Color.Yellow);
			_colors.Add("yellowgreen", Color.YellowGreen);

			#region another color convert, maybee smaller
			/*
      //_colors.Add("antiquewhite", "#faebd7");
      //_colors.Add("aqua", "#00ffff");
      //_colors.Add("aquamarine", "#7fffd4");
      //_colors.Add("azure", "#f0ffff");
      //_colors.Add("beige", "#f5f5dc");
      //_colors.Add("bisque", "#ffe4c4");
      //_colors.Add("black", "#000000");
      //_colors.Add("blanchedalmond", "#ffebcd");
      //_colors.Add("blue", "#0000ff");
      //_colors.Add("blueviolet", "#8a2be2");
      //_colors.Add("brown", "#a52a2a");
      //_colors.Add("burlywood", "#deb887");
      //_colors.Add("cadetblue", "#5f9ea0");
      //_colors.Add("chartreuse", "#7fff00");
      //_colors.Add("chocolate", "#d2691e");
      //_colors.Add("coral", "#ff7f50");
      //_colors.Add("cornflowerblue", "#6495ed");
      //_colors.Add("cornsilk", "#fff8dc");
      //_colors.Add("crimson", "#dc143c");
      //_colors.Add("cyan", "#00ffff");
      //_colors.Add("darkblue", "#00008b");
      //_colors.Add("darkcyan", "#008b8b");
      //_colors.Add("darkgoldenrod", "#b8860b");
      //_colors.Add("darkgray", "#a9a9a9");
      //_colors.Add("darkgreen", "#006400");
      //_colors.Add("darkgrey", "#a9a9a9");
      //_colors.Add("darkkhaki", "#bdb76b");
      //_colors.Add("darkmagenta", "#8b008b");
      //_colors.Add("darkolivegreen", "#556b2f");
      //_colors.Add("darkorange", "#ff8c00");
      //_colors.Add("darkorchid", "#9932cc");
      //_colors.Add("darkred", "#8b0000");
      //_colors.Add("darksalmon", "#e9967a");
      //_colors.Add("darkseagreen", "#8fbc8f");
      //_colors.Add("darkslateblue", "#483d8b");
      //_colors.Add("darkslategray", "#2f4f4f");
      //_colors.Add("darkslategrey", "#2f4f4f");
      //_colors.Add("darkturquoise", "#00ced1");
      //_colors.Add("darkviolet", "#9400d3");
      //_colors.Add("deeppink", "#ff1493");
      //_colors.Add("deepskyblue", "#00bfff");
      //_colors.Add("dimgray", "#696969");
      //_colors.Add("dimgrey", "#696969");
      //_colors.Add("dodgerblue", "#1e90ff");
      //_colors.Add("firebrick", "#b22222");
      //_colors.Add("floralwhite", "#fffaf0");
      //_colors.Add("forestgreen", "#228b22");
      //_colors.Add("fuchsia", "#ff00ff");
      //_colors.Add("gainsboro", "#dcdcdc");
      //_colors.Add("ghostwhite", "#f8f8ff");
      //_colors.Add("gold", "#ffd700");
      //_colors.Add("goldenrod", "#daa520");
      //_colors.Add("gray", "#808080");
      //_colors.Add("green", "#008000");
      //_colors.Add("greenyellow", "#adff2f");
      //_colors.Add("grey", "#808080");
      //_colors.Add("honeydew", "#f0fff0");
      //_colors.Add("hotpink", "#ff69b4");
      //_colors.Add("indianred", "#cd5c5c");
      //_colors.Add("indigo", "#4b0082");
      //_colors.Add("ivory", "#fffff0");
      //_colors.Add("khaki", "#f0e68c");
      //_colors.Add("lavender", "#e6e6fa");
      //_colors.Add("lavenderblush", "#fff0f5");
      //_colors.Add("lawngreen", "#7cfc00");
      //_colors.Add("lemonchiffon", "#fffacd");
      //_colors.Add("lightblue", "#add8e6");
      //_colors.Add("lightcoral", "#f08080");
      //_colors.Add("lightcyan", "#e0ffff");
      //_colors.Add("lightgoldenrodyellow", "#fafad2");
      //_colors.Add("lightgray", "#d3d3d3");
      //_colors.Add("lightgreen", "#90ee90");
      //_colors.Add("lightgrey", "#d3d3d3");
      //_colors.Add("lightpink", "#ffb6c1");
      //_colors.Add("lightsalmon", "#ffa07a");
      //_colors.Add("lightseagreen", "#20b2aa");
      //_colors.Add("lightskyblue", "#87cefa");
      //_colors.Add("lightslategray", "#778899");
      //_colors.Add("lightslategrey", "#778899");
      //_colors.Add("lightsteelblue", "#b0c4de");
      //_colors.Add("lightyellow", "#ffffe0");
      //_colors.Add("lime", "#00ff00");
      //_colors.Add("limegreen", "#32cd32");
      //_colors.Add("linen", "#faf0e6");
      //_colors.Add("magenta", "#ff00ff");
      //_colors.Add("maroon", "#800000");
      //_colors.Add("mediumaquamarine", "#66cdaa");
      //_colors.Add("mediumblue", "#0000cd");
      //_colors.Add("mediumorchid", "#ba55d3");
      //_colors.Add("mediumpurple", "#9370db");
      //_colors.Add("mediumseagreen", "#3cb371");
      //_colors.Add("mediumslateblue", "#7b68ee");
      //_colors.Add("mediumspringgreen", "#00fa9a");
      //_colors.Add("mediumturquoise", "#48d1cc");
      //_colors.Add("mediumvioletred", "#c71585");
      //_colors.Add("midnightblue", "#191970");
      //_colors.Add("mintcream", "#f5fffa");
      //_colors.Add("mistyrose", "#ffe4e1");
      //_colors.Add("moccasin", "#ffe4b5");
      //_colors.Add("navajowhite", "#ffdead");
      //_colors.Add("navy", "#000080");
      //_colors.Add("oldlace", "#fdf5e6");
      //_colors.Add("olive", "#808000");
      //_colors.Add("olivedrab", "#6b8e23");
      //_colors.Add("orange", "#ffa500");
      //_colors.Add("orangered", "#ff4500");
      //_colors.Add("orchid", "#da70d6");
      //_colors.Add("palegoldenrod", "#eee8aa");
      //_colors.Add("palegreen", "#98fb98");
      //_colors.Add("paleturquoise", "#afeeee");
      //_colors.Add("palevioletred", "#db7093");
      //_colors.Add("papayawhip", "#ffefd5");
      //_colors.Add("peachpuff", "#ffdab9");
      //_colors.Add("peru", "#cd853f");
      //_colors.Add("pink", "#ffc0cb");
      //_colors.Add("plum", "#dda0dd");
      //_colors.Add("powderblue", "#b0e0e6");
      //_colors.Add("purple", "#800080");
      //_colors.Add("red", "#ff0000");
      //_colors.Add("rosybrown", "#bc8f8f");
      //_colors.Add("royalblue", "#4169e1");
      //_colors.Add("saddlebrown", "#8b4513");
      //_colors.Add("salmon", "#fa8072");
      //_colors.Add("sandybrown", "#f4a460");
      //_colors.Add("seagreen", "#2e8b57");
      //_colors.Add("seashell", "#fff5ee");
      //_colors.Add("sienna", "#a0522d");
      //_colors.Add("silver", "#c0c0c0");
      //_colors.Add("skyblue", "#87ceeb");
      //_colors.Add("slateblue", "#6a5acd");
      //_colors.Add("slategray", "#708090");
      //_colors.Add("slategrey", "#708090");
      //_colors.Add("snow", "#fffafa");
      //_colors.Add("springgreen", "#00ff7f");
      //_colors.Add("steelblue", "#4682b4");
      //_colors.Add("tan", "#d2b48c");
      //_colors.Add("teal", "#008080");
      //_colors.Add("thistle", "#d8bfd8");
      //_colors.Add("tomato", "#ff6347");
      //_colors.Add("turquoise", "#40e0d0");
      //_colors.Add("violet", "#ee82ee");
      //_colors.Add("wheat", "#f5deb3");
      //_colors.Add("white", "#ffffff");
      //_colors.Add("whitesmoke", "#f5f5f5");
      //_colors.Add("yellow", "#ffff00");
      //_colors.Add("yellowgreen",  "#9acd32");
       */
			#endregion
		}

		/// <summary>
		/// prevede string na barvu
		/// </summary>
		/// <param name="value">sting ve formatu #0099ff, nebo název barvy</param>
		/// <returns>barvu z parametru</returns>
		public static Color parseColor(string value) {
			if (value.StartsWith("#")) {
				int valueNumber = Int32.Parse(value.Substring(1, 6), System.Globalization.NumberStyles.HexNumber); //Parser.parseInt(value.Substring(1, 6));
				if (valueNumber == int.MinValue) {
					return Color.Empty;
				} else {
					return Color.FromArgb(valueNumber);
				}
			}

			fillColors();
			if (value == "none")
				return Color.Empty;

			Color colorValue;
			if (_colors.TryGetValue(value.ToLower(), out  colorValue))
				return colorValue;
			else
				return Color.Empty;
		}

		/// <summary>
		/// prevede string na font
		/// </summary>
		/// <param name="value">hodnoty oddelene carkou</param>
		/// <param name="defaultValue">puvodni nastaveni</param>
		/// <returns></returns>
		public static Font parseFont(string value, Font defaultValue) {
			string[] values = value.Split(' ');
			FontStyle fontStyle = defaultValue.Style;
			string fontName = defaultValue.Name;
			float fontSize = defaultValue.Size;

			foreach (string part in values) {
				string tPart = part.Trim();
				if (isFontStyle(tPart)) {
					fontStyle = (FontStyle)Parser.parseEnum(tPart, typeof(FontStyle));
				} else {
					if (isInt(tPart)) {
						fontSize = parseInt(tPart);
					} else {
						fontName = tPart;
					}
				}
			}
			Font returnFont = new Font(fontName, fontSize, fontStyle);
			return returnFont;
		}

		public static Font parseFont(string value) {
			return parseFont(value, new Font("Array", 10, FontStyle.Regular));
		}

		public static MDATextStyle parseMDATextStyle(string value) {
			string[] values = value.Split(',');
			Font font;
			Color color;
			bool wrap;

			string tPart = value[0].ToString().Trim();
			font = parseFont(tPart);
			tPart = value[1].ToString().Trim();
			color = parseColor(tPart);
			if (value[2].ToString().Trim().ToLower() == "nowrap") {
				wrap = false;
			} else {
				wrap = true;
			}
			return new MDATextStyle(font, color, wrap);
		}

		public static MDAText parseText(string value) {
			return new MDAText(value.Trim());
		}

		public static int parseInt(string value) {
#warning CATCH v kodu
			try {
				int result = Convert.ToInt32(value);
				return result;
			}
			catch {
				return int.MinValue;
			}
		}

		public static bool isInt(string value) {
#warning CATCH v kodu
			try {
				Convert.ToInt32(value);
				return true;
			}
			catch {
				return false;
			}
		}

		public static float parseFloat(string value) {
#warning CATCH v kodu
			try {
				float result = float.Parse(value);
				return result;
			}
			catch {
				return float.NaN;
			}
		}

		public static bool isFloat(string value) {
#warning CATCH v kodu
			try {
				float.Parse(value);
				return true;
			}
			catch {
				return false;
			}
		}

		public static bool isFontStyle(string value) {
			switch (value.Trim().ToLower()) {
				case "bold":
				case "italic":
				case "regular":
				case "strikeout":
				case "underline":
					return true;
				default:
					return false;
			}
		}

		public static StringAlignment parseStringFormat(string value, bool lineAligment) {
			if (lineAligment) {
				switch (value.ToLower()) {
					case "righttop":
					case "top":
					case "lefttop":
					case "topright":
					case "topleft":
						return StringAlignment.Near;
					case "right":
					case "center":
					case "left":
						return StringAlignment.Center;
					case "bottom":
					case "leftbottom":
					case "rightbottom":
					case "bottomleft":
					case "bottomright":
						return StringAlignment.Far;
					default:
						return StringAlignment.Near;
				}
			} else {
				// Alignment
				switch (value.ToLower()) {
					case "top":
					case "center":
					case "bottom":
						return StringAlignment.Center;
					case "left":
					case "leftbottom":
					case "lefttop":
					case "topleft":
					case "bottomleft":
						return StringAlignment.Near;
					case "right":
					case "rightbottom":
					case "righttop":
					case "bottomright":
					case "topright":
						return StringAlignment.Far;
					default:
						return StringAlignment.Near;
				}
			}
		}

		public static object parseEnum(string name, Type enumType) {
			return Enum.Parse(enumType, name.Trim(), true);
		}
	}
}